#include <stdio.h>
#include "../quickjs.h"

#define JS_INIT_MODULE js_init_module
#define countof(x) (sizeof(x) / sizeof((x)[0]))

// 接受一个js的字符串
// 使用JS_ToCString转换为c的字符串
// argv[0] -> JS_ToCString -> cString
static JSValue js_string_to_c(
    JSContext *js_ctx, 
    JSValueConst this_val,
    int argc, JSValueConst *argv
){
    const char *val = JS_ToCString(js_ctx, argv[0]);
    if (val == NULL) {
        printf("js_string_to_c: JS_ToCString fail\n");
    } else {
        printf("js_string_to_c: JS_ToCString: %s\n", val);
        // 需要释放字符串
        JS_FreeCString(js_ctx, val);
    }

    return JS_UNDEFINED;
}
// 返回一个c的字符串到js
// JS_NewString创建一个js的字符串
// val -> JS_NewString -> jsString
static JSValue c_string_to_js(
    JSContext *js_ctx, 
    JSValueConst this_val,
    int argc, JSValueConst *argv
)
{
    const char *val = "hello js from c";
    return JS_NewString(js_ctx, val);
}

// 注册一个函数

// 1 函数列表
static const JSCFunctionListEntry js_test_funcs[] = {
    /* JS_CFUNC_DEF(函数入口名称，入参个数，QuickJS C 函数) */
    JS_CFUNC_DEF("js_string_to_c", 1, js_string_to_c),
    JS_CFUNC_DEF("c_string_to_js", 0, c_string_to_js),
};

// 2 函数注册
static int js_module_init(JSContext *ctx, JSModuleDef *m)
{
    return JS_SetModuleExportList(
        ctx, m, 
        js_test_funcs,countof(js_test_funcs)
    );
}

// 3 模块导出
#define JS_INIT_MODULE js_init_module
JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name)
{
    JSModuleDef *m;
    m = JS_NewCModule(ctx, module_name, js_module_init);
    if (!m)
        return NULL;
    JS_AddModuleExportList(ctx, m, js_test_funcs, countof(js_test_funcs));
    return m;
}